`include "../codigo/Registers.v"

module tb_registers ();

	reg reset;
	
	reg ena, enb, enc;
	reg [4:0] addra, addrb, addrc;
	reg [31:0] datac;
	
	wire [31:0] wdataa, wdatab;
	
	Registers registers(
	
		.reset(reset),
		
		.ena(ena),
		.addra(addra),
		.dataa(wdataa),
		
		.enb(enb),
		.addrb(addrb),
		.datab(wdatab),
		
		.enc(enc),
		.addrc(addrc),
		.datac(datac)
	
	);

	initial
	begin
		$display("=========== ANTES DO RESET =========");
		$display("Reg[ 0] : %h\tReg[16] : %h", registers.Registers[ 0], registers.Registers[16]);
		$display("Reg[ 1] : %h\tReg[17] : %h", registers.Registers[ 1], registers.Registers[17]);
		$display("Reg[ 2] : %h\tReg[18] : %h", registers.Registers[ 2], registers.Registers[18]);
		$display("Reg[ 3] : %h\tReg[19] : %h", registers.Registers[ 3], registers.Registers[19]);
		$display("Reg[ 4] : %h\tReg[20] : %h", registers.Registers[ 4], registers.Registers[20]);
		$display("Reg[ 5] : %h\tReg[21] : %h", registers.Registers[ 5], registers.Registers[21]);
		$display("Reg[ 6] : %h\tReg[22] : %h", registers.Registers[ 6], registers.Registers[22]);
		$display("Reg[ 7] : %h\tReg[23] : %h", registers.Registers[ 7], registers.Registers[23]);
		$display("Reg[ 8] : %h\tReg[24] : %h", registers.Registers[ 8], registers.Registers[24]);
		$display("Reg[ 9] : %h\tReg[25] : %h", registers.Registers[ 9], registers.Registers[25]);
		$display("Reg[10] : %h\tReg[26] : %h", registers.Registers[10], registers.Registers[26]);
		$display("Reg[11] : %h\tReg[27] : %h", registers.Registers[11], registers.Registers[27]);
		$display("Reg[12] : %h\tReg[28] : %h", registers.Registers[12], registers.Registers[28]);
		$display("Reg[13] : %h\tReg[29] : %h", registers.Registers[13], registers.Registers[29]);
		$display("Reg[14] : %h\tReg[30] : %h", registers.Registers[14], registers.Registers[30]);
		$display("Reg[15] : %h\tReg[31] : %h", registers.Registers[15], registers.Registers[31]);

		#1 reset = 0;
		#1 reset = 1;
		#1 reset = 0;

		$display("=========== DEPOIS DO RESET =========");
		$display("Reg[ 0] : %h\tReg[16] : %h", registers.Registers[ 0], registers.Registers[16]);
		$display("Reg[ 1] : %h\tReg[17] : %h", registers.Registers[ 1], registers.Registers[17]);
		$display("Reg[ 2] : %h\tReg[18] : %h", registers.Registers[ 2], registers.Registers[18]);
		$display("Reg[ 3] : %h\tReg[19] : %h", registers.Registers[ 3], registers.Registers[19]);
		$display("Reg[ 4] : %h\tReg[20] : %h", registers.Registers[ 4], registers.Registers[20]);
		$display("Reg[ 5] : %h\tReg[21] : %h", registers.Registers[ 5], registers.Registers[21]);
		$display("Reg[ 6] : %h\tReg[22] : %h", registers.Registers[ 6], registers.Registers[22]);
		$display("Reg[ 7] : %h\tReg[23] : %h", registers.Registers[ 7], registers.Registers[23]);
		$display("Reg[ 8] : %h\tReg[24] : %h", registers.Registers[ 8], registers.Registers[24]);
		$display("Reg[ 9] : %h\tReg[25] : %h", registers.Registers[ 9], registers.Registers[25]);
		$display("Reg[10] : %h\tReg[26] : %h", registers.Registers[10], registers.Registers[26]);
		$display("Reg[11] : %h\tReg[27] : %h", registers.Registers[11], registers.Registers[27]);
		$display("Reg[12] : %h\tReg[28] : %h", registers.Registers[12], registers.Registers[28]);
		$display("Reg[13] : %h\tReg[29] : %h", registers.Registers[13], registers.Registers[29]);
		$display("Reg[14] : %h\tReg[30] : %h", registers.Registers[14], registers.Registers[30]);
		$display("Reg[15] : %h\tReg[31] : %h", registers.Registers[15], registers.Registers[31]);

		#1		
		$display("// Escreve no registrador 1.");
		addrc = 5'd1;
		datac = 32'hAABBCC11;
		enc   = 1;
		#1 $display("Reg[ 1] : %h", registers.Registers[ 1]);

		#1
		$display("// Escreve no registrador 30.");
		addrc = 5'd30;
		datac = 32'h00AAFF11;
		enc   = 1;
		#1 $display("Reg[30] : %h", registers.Registers[30]);
			
		$display("// Tenta escrever no registrador 28 com enc = 0.");
		addrc = 5'd28;
		datac = 32'hAAAAAAAA;
		enc   = 0;
		$display("Reg[28] : %h", registers.Registers[28]);

		#1
		$display("// Testa em A a leitura do registrador 0.");
		addra = 5'b0;
		ena   = 1;
		#1 $display("Reg[ 0] : %h", registers.Registers[ 0]);

		#1
		$display("// Le em A o valor da posicao 1");
		addra = 5'd1;
		ena   = 1;

		#1
		$display("// Tenta ler em A a posicao 1 com ena = 0.");
		addra = 5'd1;
		ena   = 0;
 
		#1
		$display("// Le em B a posicao 28 (nao foi escrita).");
		addrb = 5'd28;
		enb   = 1;
		
		#1	
		$display("// Le em B a posicao 30 (foi escrita).");
		addrb = 5'd30;
		enb   = 1;

		#1
		$display("// Tenta ler em B a posicao 30 com enb = 0.");
		addrb = 5'd30;
		enb   = 0;

		#1
		$display("Reg[ 0] : %h\tReg[16] : %h", registers.Registers[ 0], registers.Registers[16]);
		$display("Reg[ 1] : %h\tReg[17] : %h", registers.Registers[ 1], registers.Registers[17]);
		$display("Reg[ 2] : %h\tReg[18] : %h", registers.Registers[ 2], registers.Registers[18]);
		$display("Reg[ 3] : %h\tReg[19] : %h", registers.Registers[ 3], registers.Registers[19]);
		$display("Reg[ 4] : %h\tReg[20] : %h", registers.Registers[ 4], registers.Registers[20]);
		$display("Reg[ 5] : %h\tReg[21] : %h", registers.Registers[ 5], registers.Registers[21]);
		$display("Reg[ 6] : %h\tReg[22] : %h", registers.Registers[ 6], registers.Registers[22]);
		$display("Reg[ 7] : %h\tReg[23] : %h", registers.Registers[ 7], registers.Registers[23]);
		$display("Reg[ 8] : %h\tReg[24] : %h", registers.Registers[ 8], registers.Registers[24]);
		$display("Reg[ 9] : %h\tReg[25] : %h", registers.Registers[ 9], registers.Registers[25]);
		$display("Reg[10] : %h\tReg[26] : %h", registers.Registers[10], registers.Registers[26]);
		$display("Reg[11] : %h\tReg[27] : %h", registers.Registers[11], registers.Registers[27]);
		$display("Reg[12] : %h\tReg[28] : %h", registers.Registers[12], registers.Registers[28]);
		$display("Reg[13] : %h\tReg[29] : %h", registers.Registers[13], registers.Registers[29]);
		$display("Reg[14] : %h\tReg[30] : %h", registers.Registers[14], registers.Registers[30]);
		$display("Reg[15] : %h\tReg[31] : %h", registers.Registers[15], registers.Registers[31]);
		$finish;
	end

	initial	$monitor("naddra : %d\nena   : %b\ndataa : %h\naddrb  : %d\nenb   : %b\ndatab : %h\naddrc : %d\nenc   : %b\ndatac : %h\n", addra, ena, wdataa, addrb, enb, wdatab, addrc, enc, datac);
	
endmodule
